#include "Comm.hpp"
#include "Fifo.hpp"

// int work()
// {
//     // 创建key
//     key_t key = ftok("/home/lw/storehouse/process_communication", 0x66);
//     printf("%d\n", key);

//     // 创建共享内存
//     int shmid = shmget(key, 4096, IPC_CREAT | 0666);
//     if(shmid < 0)
//     {
//         printf("shmget fail, errno is %d, errstr is %s\n", errno, strerror(errno));
//         return errno;
//     }
//     printf("shmget success, shmid = %d\n", shmid);

//     // 挂接上共享区
//     char* shmaddr = (char*)shmat(shmid, nullptr, 0);
//     if((long)shmaddr == -1)
//     {
//         printf("shmat fail, errno is %d, errstr is %s\n", errno, strerror(errno));
//         return errno;
//     }
//     printf("shmat success\n");

//     // 服务端读取
//     sleep(2);
//     printf("server 读取数据: %s\n", shmaddr);

//     // 去挂接
//     shmdt(shmaddr);
//     printf("去挂接成功\n");
    
//     // 删除共享内存
//     sleep(2);
//     shmctl(shmid, IPC_RMID, nullptr);
//     printf("删除共享内存成功\n");
// }

int main()
{
    Fifo fifo;
    Sync syn;

    int rfd = syn.OpenRD();
    printf("成功打开fifo\n");
    key_t key = GetKey();
    cout << "成功创建key, key = " << ItoH(key) << endl;
    const int size = 4096;
    sleep(2);
    int shmid = CreateShm(key, size);
    cout << "成功创建共享内存" << endl;
    sleep(2);

    char* shmaddr = (char*)ShmAttach(shmid);
    cout << "成功挂接共享内存" << endl;
    sleep(2);

    // 读
    while(1)
    {
        bool ret = syn.Wait(rfd);
        if(!ret)
            break;
        printf("%s\n", shmaddr);
    }

    ShmDetach((void*)shmaddr);
    cout << "成功去挂接共享内存" << endl;
    sleep(2);

    DeleteShm(shmid);
    cout << "成功删除共享内存" << endl;

    syn.Close(rfd);

    return 0;
}